37. Do not Re-Declare inheritanced default parameters

가상함수는 동적으로 바인딩되지만, 기본 매개변수 값은 정적으로 바인딩된다.
정적 바인딩: 선행 바인딩(early binding)
동적 바인딩: 지연 바인딩(late binding)
class Shape{
public:
enum shapeColor{ Red, Green, Blue };
virtual void draw(ShapeColor color=Red) const =0;
// ...
};
class Rectangle: public Shape{
public:
virtual void draw(ShapeColor color=Green) const; //
// ...
};
class Circle: public Shape{
public:
virtual void draw(ShapeColor color) const; //
// ...
};
Shape* ps;
Shape* pc=new Circle;
Shape* pr=new Rectangle;
pc->draw(Shape::Red); // Circle::draw(Shape::Red)
pr->draw(Shape::Red); // Rectangle::draw(Shape::Red)
pr->draw(); // Rectangle::draw(Shape::Red)
가상함수는 동적으로 바인딩 되지만, 기본 매개변수(default)는 정적으로 바인딩 되어 있다.
위에서 파생 클래스에 정의된 가상 함수는 호출하지만, 기본 클래스에 정의된 기본 매개변수 값을 사용해 버릴 수 있다.

런타임 효율을 위해서 C++은 위와같이 구현되어 있다.

비가상 인터페이스(non-virtual interface) 관용구(NVI) 사용
class Shape{
public:
enum ShapeColor{ Red, Green, Blue };
void draw(ShapeColor color=Red) const{ //
doDraw(color);
}
// ...
private:
virtual void doDraw(ShapeColor color) const=0; //
};
class Rectangle: public Shape{
public:
// ..
private:
virtual void doDraw(ShapeColor color) const;
}